package com.ck.server.db;

/**
 * @author ck
 * @date 2024/6/17 19:16
 * desc:sql优化
 */
public class SqlOptimize {
    /**
     * 1、负向查询不能使用索引
     * select * from table where id not in(1,3,4);
     * 正: select * from table where id in(2,5,6);
     *
     * 2、前导模糊查询不能使用索引
     * select * from table where name like '%张';
     * 正: select * from table where name like '张%';
     *
     * 3、在索引列上进行函数操作不能使用索引
     * select * from table where FROM_UNIXTIME(create_time) < CURDATE();
     * 正(将比较条件改为等价条件): select * from table where create_time < FROM_UNIXTIME(CURDATE());
     *
     * 4、最左前缀问题
     * 如果给 user 表中的 username pwd 字段创建了复合索引那么使用以下SQL 都是可以命中索引
     * select username from user where username='zhangsan' and pwd ='axsedf1sd';
     * select username from user where pwd ='axsedf1sd' and username='zhangsan';
     * select username from user where username='zhangsan';
     * 反: select username from user where pwd ='axsedf1sd';
     *
     * 5、数据区分不明显的不建议创建索引
     * 如 user 表中的性别字段，可以明显区分的才建议创建索引，如身份证等字段。
     *
     * 6、字段的默认值不要为 null
     *
     * 7、如果明确知道只有一条记录返回
     * select name from user where username='zhangsan' limit 1;
     * 这样可以提高效率，可以让数据库停止游标移动
     *
     * 8、不要让数据库帮我们做强制类型转换
     * select name from user where telno=12345678;
     * 这样虽然可以查出数据，但是会导致全表扫描
     *正: select name from user where telno='12345678'
     *
     * 9、如果需要进行join的字段两表的字段类型要相同 不然也不会命中索引
     */
}
